今天就來看一下人臉辨識 + 物件追蹤可以迸出什麼樣的火花吧!
applications目錄下新增face_tracking目錄與main.py檔案main.py:
import ntpath
import sys
# resolve module import error in PyCharm
sys.path.append(ntpath.dirname(ntpath.dirname(ntpath.dirname(ntpath.abspath(__file__)))))
import argparse
import time
import cv2
from imutils.video import WebcamVideoStream, FPS
from face_detection.dlib_mmod import detect
# 初始化OpenCV提供的追蹤方法列表
OPENCV_OBJECT_TRACKERS = {
    # 更準確但比kcf慢
    "csrt": cv2.TrackerCSRT_create,
    # 速度與準確兼備
    "kcf": cv2.TrackerKCF_create,
    "boosting": cv2.TrackerBoosting_create,
    "mil": cv2.TrackerMIL_create,
    "tld": cv2.TrackerTLD_create,
    "medianflow": cv2.TrackerMedianFlow_create,
    # 更快但比kcf不準
    "mosse": cv2.TrackerMOSSE_create
}
def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("-t", "--tracker", type=str,
                    default="kcf",
                    choices=["csrt", "kcf", "boosting", "mil", "tld", "medianflow", "mosse"],
                    help="the object tracker type")
    args = vars(ap.parse_args())
    # 初始化object tracker
    trackers = cv2.MultiTracker_create()
    # 啟動WebCam
    vs = WebcamVideoStream().start()
    time.sleep(2.0)
    fps = FPS().start()
    initFace = False
    while True:
        # 取得當前的frame
        frame = vs.read()
        # 使用dlib: MMOD來偵測人臉並追蹤
        if not initFace:
            rects = detect(frame)
            for rect in rects:
                print(rect)
                tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
                trackers.add(tracker, frame, rect)
            initFace = True
        # 物件追蹤更新
        (_, boxes) = trackers.update(frame)
        # 偵測物件位置與畫圖
        if len(boxes) > 0:
            for box in boxes:
                (x, y, w, h) = [int(b) for b in box]
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            fps.update()
            fps.stop()
            cv2.putText(frame, "FPS: {:.2f}".format(fps.fps()), (10, frame.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
        cv2.imshow("frame", frame)
        key = cv2.waitKey(1) & 0xff
        # 你也可以用判斷是否需要圈選物件 (按下c按鍵)
        if key == ord('c'):
            # 圈選矩形框 (需按下空白鍵或Enter確認)
            box = cv2.selectROI("frame", frame, fromCenter=False, showCrosshair=True)
            print(box)
            tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
            trackers.add(tracker, frame, box)
            fps = FPS().start()
        # 按下q鍵就離開程式
        elif key == ord('q'):
            break
    vs.stop()
    fps.stop()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    main()
face_tracking目錄下與輸入python main.py:![]()
程式碼部分應該很好理解,
我們把前面的人臉追蹤功能,
與cv2.tracker相關的邏輯合併在一起就完成今天的應用了。
你也可以透過按下
c按鍵拉矩形範圍與space空白鍵確認,來新增一個tracker追蹤物件
.
.
電腦視覺的世界還有很多問題需要克服,
但到目前也已經有很多的進展,
可以讓我們盡情地去發想各式各樣的應用。
期待你經過這個系列能對這個領域有些些的理解與幫助,
也期待在未來能看到你做出專屬於自己的應用。
系列的原始碼參考